class Evaluacion::VentaController < ApplicationController

  def list
    @concurso = Concurso.find(params[:id])
    opciones = {}
    opciones[:concurso_id] = params[:id]
    
    if !perfil_nacional?
      opciones[:ejecutivo_id] = session[:user]
      
    end
    
    @evaluaciones = Evaluacion.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :conditions => opciones
    limite = @concurso.fecha_termino.next_month
    @allow_new = Time.now < limite
    
  end

  def new
    @concurso = Concurso.find(params[:id])
    @marcas = Array.new
    @concurso.concurso_ventas.each do |m|
      @marcas << Familia.find(m.marca_id).nombre
    end

    @marcas_select = Hash.new
    @concurso.concurso_ventas.each do |m|
      @marcas_select[Familia.find(m.marca_id).nombre] =  m.marca_id
    end

    @evaluacion = Evaluacion.new(:concurso_id => @concurso, :ejecutivo_id => session[:user])
    @evaluacion.evaluacion_ventas << EvaluacionVenta.new
    centro = Centro.find(@concurso.centro)
    @participantes = centro.empleados
  end

  def show
    @evaluacion = Evaluacion.find(params[:id])
    @centro = Centro.find(@evaluacion.concurso.centro)
    
  end
  
  def index
    list
    render :action => "list", :id => params[:id]   
  end
  
  def create
    @evaluacion = Evaluacion.new(params[:evaluacion])
    @evaluacion.ejecutivo_id = session[:user]
    @evaluacion.concurso_id = params[:id]
    
    if @evaluacion.save
      logger.debug "Evaluacion guardada."
      concurso = Concurso.find(params[:id])
      marcas = Array.new
      concurso.concurso_ventas.each do |m|
        marcas << m.marca_id
      end
      
      logger.debug "Recorrer evaluaciones ventas"
      @evaluacion.evaluacion_ventas.each do |v|
        if pertenece_a_marca_bonificable?(marcas, v)
          logger.debug "Pertenece a marca bonificable"
          puntos = 0
          concurso.concurso_ventas.each do |cv|
            if v.marca_id == cv.marca_id
              # obtener botellas vendidas
              copas = @evaluacion.copas_vendidas(v.participante_id, v.marca_id)
              # obtener copas vendidas
              botellas = @evaluacion.botellas_vendidas(v.participante_id, v.marca_id)
              puntos += cv.puntos_copa * copas
              puntos += cv.puntos_botella * botellas
              logger.info "Puntos calculados para #{copas} copas y #{botellas} botellas de marca #{v.marca_id}: #{puntos}"
              
              nuevo_puntaje = PuntajeMesero.new(:operacion => PuntajeMesero::ABONO,
                :evaluacion_id => @evaluacion.id, :puntos => puntos, :empleado_id => v.participante_id)
              nuevo_puntaje.save!
              logger.debug "Guardando nuevo puntaje: #{nuevo_puntaje.id}"
            end
          end
        end
      end
      
      flash[:notice] = "La Evaluacion se agrego correctamente."
      redirect_to :action => "index", :id => params[:id]
    else
      @concurso = Concurso.find(params[:id])

      @marcas = Array.new
      @concurso.concurso_ventas.each do |m|
        @marcas << Familia.find(m.marca_id)
      end

      @marcas_select = Hash.new
      @concurso.concurso_ventas.each do |m|
        @marcas_select[Familia.find(m.marca_id).nombre] =  m.marca_id
      end
      centro = Centro.find(@concurso.centro)
      @participantes = centro.empleados
      render :action => "new", :id => params[:id]
      
    end    
  end
  
  def pertenece_a_marca_bonificable?(marcas, evaluacion_venta)
    marcas.each do |m|
      if m == evaluacion_venta.marca_id
        return true
      end
    end
    false
  end

  def canje
    evaluacion = Evaluacion.find(params[:id])
    centro_id = evaluacion.concurso.centro_id
    centro = Centro.find(centro_id)
    
    @familias = Familia.cuervo
    @inicio = evaluacion.concurso.fecha_inicio
    @termino = evaluacion.concurso.fecha_termino
    empleados = centro.empleados
    minimo_tripulacion = evaluacion.concurso.minimo_cumplimiento_tripulacion
    
    @empleados_list = Array.new
    empleados.each do |e|
      @empleados_list << e if e.puntos_acumulados(@inicio, @termino) > minimo_tripulacion
    end

    conditions = {}
    conditions[:evaluacion_id] = evaluacion
    
    @lista_canje = Canje.find(:all, :conditions => conditions)
    @id = params[:id]
    
  end

  def producto_selected
    logger.debug "params[:id] => #{params[:id]}"
    
    unless params[:id].nil?
      producto = Producto.find(params[:id])
    
      render :partial => 'producto', :locals => {:producto => producto}, :layout => false
    else
      render :text => '<div id="p_info"></div>', :layout => false
    end
  end
  
  def empleado_selected
    logger.debug "params[:id] => #{params[:id]}"
    
    unless params[:id].nil?
      empleado = Empleado.find(params[:id])
      
      render :partial => 'empleado', :locals => {:empleado => empleado}, :layout => false
    else
      render :text => '<div id="e_info"></div>', :layout => false
    end
  end
  
  def asignar_a
    evaluacion = Evaluacion.find(params[:id])
    centro_id = evaluacion.concurso.centro_id
    centro = Centro.find(centro_id)
    producto = Producto.find(params[:productos])
    
    conditions = {}
    conditions[:evaluacion_id] = params[:id]
    conditions[:empleado_id] = params[:empleados]
    
    canje = Canje.find(:first, :conditions => conditions)
    
    if canje.nil?
      canje = Canje.new
      canje.evaluacion_id = params[:id]
      canje.empleado_id = params[:empleados]
    end
    
    canje_detalle = CanjeDetalle.new
    canje_detalle.producto_id = params[:productos]
    canje_detalle.costo = producto.costo_cuervo
    canje_detalle.precio = producto.precio_venta
    canje_detalle.puntos_canje = producto.puntos_canje
    
    canje.canje_detalles << canje_detalle
    
    @familias = Familia.cuervo
    @empleados = centro.empleados
    
    conditions = {}
    conditions[:evaluacion_id] = evaluacion
    
    @lista_canje = Canje.find(:all, :conditions => conditions)
    @id = params[:id]

    if canje.save
      redirect_to :action => "canje", :id => params[:id]
    else
      flash[:error] = "Error al guardar"
      
      redirect_to :action => "canje", :id => params[:id]
    end
  end
  
  def canje_remover
    CanjeDetalle.delete(params[:id])
    
    redirect_to :action => "canje", :id => params[:evaluacion]
  end
  
  def crear_orden
    @evaluacion = Evaluacion.find(params[:id])
    centro_id = @evaluacion.concurso.centro_id
    @centro = Centro.find(centro_id)
    lista_canje = Canje.find(:all, :conditions => {:evaluacion_id => params[:id]})
    
    @orden_salida = OrdenSalida.new
    @orden_salida.domicilio = @centro.domicilio
    @orden_salida.tipo_referencia = OrdenSalida::TIPO_REFERENCIA[:evaluacion]
    @orden_salida.referencia_id = params[:id]
    
    @importe_costo = 0.0
    lista_canje.each do |c|
      c.canje_detalles.each do |d|
        producto = Producto.find(d.producto_id)
        @importe_costo += d.costo
        @orden_salida.agregar_detalle(producto)
      end
    end
    
    @presupuestos = Catalogo.find_by_nombre('Origen Presupuesto').entradas_catalogo
    marcas_presupuesto = Presupuesto.find(:all, :conditions => {:centro_id => centro_id})
    @marcas_presupuesto = marcas_presupuesto.dup
    @marcas_presupuesto.each do |m|
      m.saldo_inicial = 0.0
    end
  end
  
  def guardar_orden
    @orden_salida = OrdenSalida.new(params[:orden])
    @evaluacion = Evaluacion.find(params[:id])
    @orden_salida.centro = Centro.find(@evaluacion.concurso.centro_id)
    @orden_salida.ejecutivo = Ejecutivo.find(session[:user])
    @orden_salida.autorizar_id = Ejecutivo.find(session[:user]).reporta_a_id
    @orden_salida.referencia_id = @evaluacion.consecutivo
    @orden_salida.tipo_referencia = OrdenSalida::TIPO_REFERENCIA[:evaluacion]
    @orden_salida.referencia_id = params[:id]

    # proceso de autorizacion vs presupuesto disponible
    marcas_presupuesto = params[:marcas][:presupuesto]
    
    # salida por bonificacion
    if @orden_salida.tipo_presupuesto_id == 10
      @orden_salida.presupuesto_suficiente = true
      @orden_salida.status_id = 1 
      # salida por patrocionio (presupuesto)
    elsif @orden_salida.tipo_presupuesto_id == 20
      @orden_salida.presupuesto_suficiente = true #validar_presupuestos(marcas_presupuesto)
      @orden_salida.status_id = 1
      # solicitud de salida por 'on premise'
    elsif @orden_salida.tipo_presupuesto_id == 30
      @orden_salida.presupuesto_suficiente = true
      # status => 'solicitado'
      @orden_salida.status_id = 0
    end
    
    if @orden_salida.save
      flash[:notice] = "La Orden de Salida se agrego correctamente."
            
      # verificar el tipo de presupuesto 
      # bolsa
      if @orden_salida.tipo_presupuesto_id == 10
        bf = BonificacionDetalle.new
        bf.centro_id = @orden_salida.centro_id
        bf.importe = @orden_salida.monto_total_precio_publico
        bf.operacion = BonificacionDetalle::CARGO
        bf.referencia = @orden_salida.consecutivo
        bf.destino_id = Bonificacion::ESPECIE
        bf.fecha_bonificacion = Time.now

        bf.save
        
        # patrocinio
      elsif @orden_salida.tipo_presupuesto_id == 20
        marcas_presupuesto = params[:marcas][:presupuesto]
        marcas_presupuesto.each do |p|
          if p[1][:saldo_inicial].to_f > 0.0
            create_cargo(p[0], p[1][:saldo_inicial])
            registrar_presupuesto(@orden_salida, p[0])
          end
        end
                
      end
      
      # reducir puntos meseros
      @evaluacion.canjes.each do |c|
        c.canje_detalles.each do |d|
          descargo = PuntajeMesero.new(:operacion => PuntajeMesero::CARGO,
            :puntos => d.puntos_canje, :evaluacion_id => @evaluacion.id,
            :empleado_id => c.empleado_id)
          logger.debug "Descargando #{d.puntos_canje} por producto #{d.producto_id} para empleado #{c.empleado_id}"
          descargo.save!
        end
      end
      
      # borrar canjes
      @evaluacion.canjes.each do |c|
        CanjeDetalle.delete(c.canje_detalle_ids)
      end
      
      Canje.delete(@evaluacion.canje_ids)
   
      redirect_to :controller => '/salida'
    else
      @evaluacion = Evaluacion.find(params[:id])
      @centro = Centro.find(@evaluacion.concurso.centro_id)
      @orden_salida.domicilio = @centro.domicilio
      @presupuestos = Catalogo.find_by_nombre('Origen Presupuesto').entradas_catalogo
      marcas_presupuesto = Presupuesto.find(:all, :conditions => {:centro_id => @evaluacion.concurso.centro_id})
      @marcas_presupuesto = marcas_presupuesto.dup
      @marcas_presupuesto.each do |m|
        m.saldo_inicial = 0.0
      end
      
      @importe_costo = 0.0
      @importe_publico = 0.0
      @orden_salida.orden_salida_detalles.each do |d|
        @importe_costo += (d.costo_unitario * d.cantidad)
        @importe_publico += (d.precio_publico * d.cantidad)
        
      end

      render :action => "crear_orden", :id => @evaluacion
    end
    
  end
  
  def create_cargo(presupuesto_id, importe_ieps)
    presupuesto = Presupuesto.find(presupuesto_id)
    cargo = PresupuestoDetalle.new(:operacion => PresupuestoDetalle::CARGO,
      :importe => importe_ieps)
    presupuesto.presupuesto_detalles << cargo
      
    presupuesto.save!
    
  end
  
  def lista_participantes
    evaluacion = Evaluacion.find(params[:id])
    @concurso = evaluacion.concurso
    
    conditions = {}
    conditions[:evaluacion_id] = evaluacion
    
    @lista_canje = Canje.find(:all, :conditions => conditions)
    
    render :action => 'lista_participantes', :layout => false
  end
  
  def presupuesto_changed
    logger.debug "params[:id] => #{params[:id]}"
    
    unless params[:id].nil?
      tipo_presupuesto = params[:id].to_i
      
      if tipo_presupuesto == 10 || tipo_presupuesto == 30
        logger.debug "apagar div marcas"
        render :update do |page|
          page.hide 'marcas'
        end
      else
        logger.debug "mostrar div marcas"
        render :update do |page|
          page.show 'marcas'
        end
      end
    end
    
  end
end
